package net.confinanz.client.data;

import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import net.confinanz.client.controller.Controller;
import net.confinanz.client.exceptions.NotConnectedException;
import net.confinanz.config.ClientConfig;

public class Bereich implements Serializable {
	
	private static final long serialVersionUID = -3830773698961720124L;
	
	private static final String SELECT 			= "SELECT * FROM `meta_bereich` ";
	private static final String INSERT 			= "INSERT INTO `confinanz`.`meta_bereich` (`bereich_bezeichner`) VALUES (";	// TODO
	private static final String UPDATE 			= "UPDATE `meta_bereich` SET ";
	private static final String SPARTE			= "SELECT * FROM `rel_bereich_sparte` ";
	
	private String id;
	private String bezeichner;
	private Vector<Sparte> sparten;

	public Bereich() {
		setId("");
		setBezeichner("");
		setSparten(new Vector<Sparte>());
	}
	
	public Bereich(String id, Controller controller) throws SQLException, NotConnectedException {
		setId(id);
		fromDatabase(controller);
	}

	
//	##### Instanz Methoden #####
	
	public String getId() {
		return id;
	}

	private void setId(String id) {
		this.id = id;
	}

	public String getBezeichner() {
		return bezeichner;
	}

	public void setBezeichner(String bezeichner) {
		this.bezeichner = bezeichner;
	}

	public Vector<Sparte> getSparten() {
		return sparten;
	}

	public void setSparten(Vector<Sparte> sparten) {
		this.sparten = sparten;
	}

	public String toStringExtended() {
		return (this.id + " : " + this.bezeichner);
	}
	
	public String toStringDatabase() {
		return toStringExtended();
	}
	
	
//	##### Datenbank Methoden #####
	
	public void fromDatabase(Controller controller) throws SQLException, NotConnectedException {
		String sql = SELECT + "WHERE `bereich_id` = " + getId();
		controller.logMessage("SQL-QUERY: " + sql);
		ResultSet result = controller.getConnector().select(sql);
		
		if (result.first()) {
			setBezeichner(result.getString("bereich_bezeichner"));
			
			controller.logMessage("RESULT: " + toStringDatabase());
		} else throw new SQLException("There is no dataset with `bereich_id` = " + getId() + " in table `meta_bereich`.");
		
		// Sparten einlesen
		sql = SPARTE + "WHERE `rbs_bereich` = " + getId();
		controller.logMessage("SQL-QUERY: " + sql);
		result = controller.getConnector().select(sql);
		
		Vector<Sparte> sparten = new Vector<Sparte>();
		while(result.next()) {
			sparten.add(new Sparte(result.getString("rbs_sparte"), controller));
		}
		setSparten(sparten);
	}
	
	public void toDatabase(Controller controller) throws SQLException, NotConnectedException {
		if (ClientConfig.userFlag == ClientConfig.DEVELOPER) {
			String sql;
			if (getId().equals("")) {
				sql = INSERT + "'" + getBezeichner()
						+ "')";
				
				controller.logMessage("SQL-QUERY: " + sql);
				controller.getConnector().insert(sql);

				sql = Controller.INSERT_ID;
				controller.logMessage("SQL-QUERY: " + sql);
				ResultSet result = controller.getConnector().select(sql);
				
				if (result.first()) {
					setId(result.getString("id"));
				}
				controller.logMessage("RESULT: " + toStringDatabase());
			} else {
				sql = UPDATE + "`bereich_bezeichner` = '" + getBezeichner()
						+ "' WHERE `bereich_id` = " + getId();
				
				controller.logMessage("SQL-QUERY: " + sql);
				controller.getConnector().insert(sql);
				controller.logMessage("RESULT: " + toStringDatabase());
			}
		}
	}
	
	
//	##### Override Methoden #####
	
	@Override
	public String toString() {
		return this.bezeichner;
	}
	
	@Override
	public boolean equals(Object object) {
		return ((object instanceof Bereich) && (((Bereich) object)).getId().equals(this.getId()));
	}
}